/**
 * * reduce 
 * * arr.reduce(callback, [initialValue])
 * * callback包含四个参数
 * * 1、previousValue （上一次调用回调返回的值，或者是提供的初始值（initialValue））
 * * 2、currentValue （数组中当前被处理的元素）
 * * 3、index （当前元素在数组中的索引）
 * * 4、array （调用 reduce 的数组）
 * 
 * * initialValue 上一次调用回调返回的值，或者是提供的初始值（initialValue）
 */

arr = [1, 2, 3, 5, 8, 6, 0, 9, 1, 2, 3, 4, 5]

/**
 * * reduce egg
 */

let sum = arr.reduce(function (pre, value, index, array) {
  // 没有设置initialValue
  // console.log(pre, value, index);     // 1 2 1  从索引为1开始,pre初始值为数组第一个值
  return pre + 1                      // 数组第一个值改为2  pre=2
})
// console.log(sum);

let sum1 = arr.reduce(function (pre, value, index, array) {
  // 设置initialValue的值为0
  // console.log(pre, value, index);      // 0 1 0 从索引值为0开始,初始值为0
  return pre + 1
}, 0)

// console.log(sum1);

/**
 * application  数组求和
 */

let arr1 = [1, 2, 3, 5, 8, 6, 0, 9]
let sum2 = arr1.reduce((pre, value, index, arr) => {
  console.log(pre, value,index);
  return pre + value    //没设置initialValue 从索引为1开始,pre初始值为数组第一个元素
})
// console.log(sum2); //34   数组求乘积也可


/**
 *  * 数组去重
 *  * includes() 判断Array是否包含某一元素 返回值为true or false
 *  * concat()   连接两个或多个数组, 不会改变原数组
 */

let newArr = arr.reduce((pre, value) => {
  if (!pre.includes(value)) {
    return pre.concat(value)
  }  else {
    return pre
  }
}, [])
// console.log(newArr); 


/**
 *  统计元素出现个数
 */
 let names = ['Alice', 'Bob', 'Tiff', 'Bruce', 'Alice'];
 let namNum = names.reduce((pre, value) => {
   console.log(pre, value);
  if (value in pre){
    console.log(pre);
    pre[value]++
  } else {
    pre[value] = 1
  }
  return pre
 }, {})
console.log(namNum);

let object = {
  name: 'mike',
  age: '19',
}
if ('name' in object){
  // console.log("true");   //判断一个属性是否在一个对象里  true
}